package qyWechat

import "reflect"

type Route struct {
	where   map[string]string
	handler Handler
}

type Router struct {
	routes []Route
}

func NewRouter() *Router {
	return &Router{
		routes: make([]Route, 0),
	}
}

// 绑定事件函数
func (r *Router) Add(where map[string]string, h Handler) {
	r.routes = append(r.routes, Route{
		where:   where,
		handler: h,
	})
}

// 条件匹配
func (r *Router) compare(cc reflect.Value, where map[string]string) bool {
	for k, v := range where {
		f := cc.MethodByName(k) // 取名为k的函数
		if !f.IsValid() {
			return false // 函数不存在
		}
		vs := f.Call(nil) // 调用函数
		if len(vs) == 0 {
			return false // 无返回值
		}
		if vs[0].String() != v {
			return false // 不相等
		}
	}
	return true
}

// 匹配事件函数
func (r *Router) FindHandler(c Context) Handler {
	cc := reflect.ValueOf(c.Request())
	for _, o := range r.routes {
		if r.compare(cc, o.where) {
			return o.handler
		}
	}
	return nil
}
